home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / tolmangr / part01
Encoding:
Internet Message Format  |  1991-02-18  |  51.4 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i016: ToolManager 1.2 - add to the Tools menu of Workbench 2.0, Part01/01
  4. Reply-To: stefanb@cip-s02.informatik.rwth-aachen.de (Stefan Becker)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i016@ab20.larc.nasa.gov>
  7. Date: 18 Feb 91 22:08:04 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga.misc
  11.  
  12. Submitted-by: stefanb@cip-s02.informatik.rwth-aachen.de (Stefan Becker)
  13. Posting-number: Volume 91, Issue 016
  14. Archive-name: utilities/toolmanager-12/part01
  15.  
  16. [ uuencoded executable enclosed  ...tad ]
  17.  
  18. With ToolManager you can add your own programs to the Tools menu of the 2.0
  19. Workbench. The name of the programs can be given at startup (CLI or Workbench
  20. parameters) or in a configuration file. Furthermore the user can drop a Tool or
  21. Project icon on the program's icon (or its status window) to add a tool to the
  22. list.
  23.  
  24.  
  25. #!/bin/sh
  26. # This is a shell archive.  Remove anything before this line, then unpack
  27. # it by saving it into a file and typing "sh file".  To overwrite existing
  28. # files, type "sh file -c".  You can also feed this as standard input via
  29. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  30. # will see the following message at the end:
  31. #        "End of archive 1 (of 1)."
  32. # Contents:  DMakefile ToolManager.Readme ToolManager.c
  33. #   ToolManager.config ToolManager.doc ToolManager.h ToolManager.uu
  34. #   data.c toollist.c window.c
  35. # Wrapped by tadguy@ab20 on Mon Feb 18 17:08:02 1991
  36. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  37. if test -f 'DMakefile' -a "${1}" != "-c" ; then 
  38.   echo shar: Will not clobber existing file \"'DMakefile'\"
  39. else
  40. echo shar: Extracting \"'DMakefile'\" \(232 characters\)
  41. sed "s/^X//" >'DMakefile' <<'END_OF_FILE'
  42. XSRCS=toolmanager.c toollist.c window.c data.c
  43. XOBJS=$(SRCS:"*.c":"*.o")
  44. X
  45. XToolManager : $(OBJS)
  46. X         dcc -o %(left) %(right)
  47. X
  48. X$(OBJS) : $(SRCS)
  49. X         dcc -o %(left) -c %(right)
  50. X
  51. X$(SRCS) : ToolManager.h
  52. X         SetDate %(left)
  53. END_OF_FILE
  54. if test 232 -ne `wc -c <'DMakefile'`; then
  55.     echo shar: \"'DMakefile'\" unpacked with wrong size!
  56. fi
  57. # end of 'DMakefile'
  58. fi
  59. if test -f 'ToolManager.Readme' -a "${1}" != "-c" ; then 
  60.   echo shar: Will not clobber existing file \"'ToolManager.Readme'\"
  61. else
  62. echo shar: Extracting \"'ToolManager.Readme'\" \(933 characters\)
  63. sed "s/^X//" >'ToolManager.Readme' <<'END_OF_FILE'
  64. XReadme for ToolManager 1.2                                          13.01.1991
  65. X
  66. XWith ToolManager you can add your own programs to the Tools menu of the 2.0
  67. XWorkbench. The name of the programs can be given at startup (CLI or Workbench
  68. Xparameters) or in a configuration file. Furthermore the user can drop a Tool or
  69. XProject icon on the program's icon (or its status window) to add a tool to the
  70. Xlist.
  71. X
  72. XBEWARE: This program makes heavely use of the new 2.0 functions, so its
  73. X        completely useless to all people who are still forced to use 1.3 :-)
  74. X
  75. XNew features since 1.1:
  76. X   - Status window changed to a no-GZZ & simple refresh type
  77. X     (this should save some bytes)
  78. X   - Status window remembers its last position
  79. X   - New status window gadget "Save Configuration": saves the actual tool
  80. X     list in the configuration file
  81. X   - Small bugs removed in the ListView gadget handling
  82. X   - Name of the icon hard-wired to "ToolManager"
  83. END_OF_FILE
  84. if test 933 -ne `wc -c <'ToolManager.Readme'`; then
  85.     echo shar: \"'ToolManager.Readme'\" unpacked with wrong size!
  86. fi
  87. # end of 'ToolManager.Readme'
  88. fi
  89. if test -f 'ToolManager.c' -a "${1}" != "-c" ; then 
  90.   echo shar: Will not clobber existing file \"'ToolManager.c'\"
  91. else
  92. echo shar: Extracting \"'ToolManager.c'\" \(8003 characters\)
  93. sed "s/^X//" >'ToolManager.c' <<'END_OF_FILE'
  94. X#include "ToolManager.h"
  95. X
  96. X/* Library pointers */
  97. Xextern struct Library *SysBase,*IntuitionBase,*GfxBase; /* Autoinit Libs */
  98. Xstruct Library *WorkbenchBase,*IconBase,*GadToolsBase;
  99. X
  100. X/* Structures for icon */
  101. Xextern struct DiskObject MyIcon;
  102. Xstatic struct AppIcon *MyAppIcon;
  103. X
  104. X/* Name of the message port & icon */
  105. Xstatic char *MyName="ToolManager";
  106. X
  107. X/* Tags for System() */
  108. Xextern struct TagItem MyTags[];
  109. X#define SYSTAGS_IN  0
  110. X#define SYSTAGS_OUT 1
  111. X
  112. X/* miscellaneous */
  113. Xstatic struct AppMenuItem *MyAppMenuItem;
  114. X
  115. X/* Workbench main entry point */
  116. Xvoid wbmain(struct WBStartup *wbarg)
  117. X{
  118. X BPTR fl;
  119. X
  120. X fl=CurrentDir(wbarg->sm_ArgList->wa_Lock); /* Goto a valid directory */
  121. X startup();                                 /* common startup code */
  122. X CurrentDir(fl);                            /* Go back to old directory */
  123. X                                            /* Process WB startup parameters */
  124. X WBAddToolNode(&wbarg->sm_ArgList[1],wbarg->sm_NumArgs-1);
  125. X mainloop();                                /* Go into main loop */
  126. X}
  127. X
  128. X/* CLI main entry point */
  129. Xvoid main(int argc, char **argv)
  130. X{
  131. X int i;
  132. X BPTR fl;
  133. X
  134. X startup();           /* common startup code */
  135. X fl=CurrentDir(NULL); /* Get current directory lock */
  136. X                      /* Process CLI startup parameters */
  137. X for (i=1; i<argc; i++) AddToolNode(fl,argv[i],NULL);
  138. X CurrentDir(fl);      /* Go back to old directory */
  139. X mainloop();          /* Go into main loop */
  140. X}
  141. X
  142. X/* Buffer length for one config file line */
  143. X#define BUFLEN 100
  144. X
  145. X/* Handle common startup operations */
  146. Xvoid startup(void)
  147. X{
  148. X BPTR fl;
  149. X FILE *fh;                /* Filehandle for config file */
  150. X char ConfigLine[BUFLEN]; /* Buffer for one config file line */
  151. X
  152. X if (SysBase->lib_Version<36)  /* Sanity check */
  153. X  {
  154. X   puts("You need a Kickstart 2.0 or better to run ToolManager!");
  155. X   exit(20);
  156. X  }
  157. X
  158. X Forbid();                     /* Is "ToolManager" already running? */
  159. X MyMP=FindPort(MyName);
  160. X Permit();
  161. X if (MyMP)
  162. X  {                            /* Yes, exit gracefully */
  163. X   puts("ToolManager already running!");
  164. X   exit(5);
  165. X  }
  166. X
  167. X /* Open libraries */
  168. X if (!(WorkbenchBase=OpenLibrary(WORKBENCH_NAME,0)))
  169. X  cleanup(1);
  170. X
  171. X if (!(IconBase=OpenLibrary(ICONNAME,0)))
  172. X  cleanup(2);
  173. X
  174. X if (!(GadToolsBase=OpenLibrary("gadtools.library",0)))
  175. X  cleanup(3);
  176. X
  177. X /* Create message port */
  178. X if (!(MyMP=CreateMsgPort()))
  179. X  cleanup(4);
  180. X MyMP->mp_Node.ln_Pri=0;
  181. X MyMP->mp_Node.ln_Name=MyName;   /* Our name */
  182. X AddPort(MyMP);                  /* Announce our presence */
  183. X
  184. X /* Notify Workbench about icon */
  185. X if (!(MyAppIcon=AddAppIcon(NULL,NULL,MyName,MyMP,NULL,&MyIcon,NULL)))
  186. X  cleanup(5);
  187. X
  188. X /* Notify Workbench about special menu item. If this item is selected,
  189. X    the program will quit */
  190. X if (!(MyAppMenuItem=AddAppMenuItem(NULL,NULL,"Quit ToolManager",MyMP,NULL)))
  191. X  cleanup(6);
  192. X
  193. X NewList(&ToolList);  /* Initialize tool list */
  194. X fl=CurrentDir(NULL); /* Get the current directory */
  195. X
  196. X if (fh=fopen(ConfigName,"r")) /* Scan config file */
  197. X  {
  198. X   while (!feof(fh)) /* if not end of file, read one line into buffer */
  199. X    if (fgets(ConfigLine,BUFLEN,fh) && (strlen(ConfigLine)>1))
  200. X     {
  201. X      char *tp;
  202. X
  203. X      ConfigLine[strlen(ConfigLine)-1]='\0'; /* Strip newline */
  204. X      if (tp=strchr(ConfigLine,';'))         /* scan config line */
  205. X       {
  206. X        *tp='\0';                        /* Menu entry ; real program name */
  207. X        AddToolNode(fl,ConfigLine,++tp);
  208. X       }
  209. X      else
  210. X       AddToolNode(fl,ConfigLine,NULL);  /* Menu entry == real program name */
  211. X     }
  212. X   fclose(fh);  /* close config file */
  213. X  }
  214. X CurrentDir(fl); /* go back to old directory */
  215. X}
  216. X
  217. X/* The main processing loop */
  218. Xvoid mainloop(void)
  219. X{
  220. X BOOL end=TRUE;                  /* Flag for main loop */
  221. X BOOL windowopen=FALSE;          /* Flag for status window */
  222. X ULONG sigs,bsigs,psigs,wsigs;   /* Buffers for signals */
  223. X
  224. X bsigs=SIGBREAKF_CTRL_C|         /* break signals */
  225. X       SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F;
  226. X psigs=1L<<MyMP->mp_SigBit;      /* port signal */
  227. X sigs=bsigs|psigs;               /* merge signals */
  228. X
  229. X while (end)                     /* main loop */
  230. X  {
  231. X   struct AppMessage *msg;       /* pointer to received message */
  232. X   ULONG gotsigs;                /* received signals */
  233. X
  234. X   gotsigs=Wait(sigs);           /* Wait for specified signals */
  235. X
  236. X   if (gotsigs&bsigs)            /* Got break signals? */
  237. X    end=FALSE;                   /* Yes, quit program */
  238. X
  239. X   if (gotsigs&psigs)            /* Message arrived at message port? */
  240. X    while (msg=GetMsg(MyMP))     /* Yes, empty message queue */
  241. X     {
  242. X      switch(msg->am_Type)       /* Switch between message types */
  243. X       {
  244. X        case MTYPE_APPWINDOW:    /* Window action */
  245. X        case MTYPE_APPICON:      /* Icon action */
  246. X         if (msg->am_NumArgs==0) /* Did the user double click my icon? */
  247. X          {                      /* Yes! If window not open, open it */
  248. X           if ((!windowopen) && (wsigs=OpenStatusWindow()))
  249. X            {
  250. X             sigs|=wsigs;        /* Merge with other signals */
  251. X             windowopen=TRUE;    /* Window is open */
  252. X            }
  253. X          }
  254. X         else                    /* User dropped an icon on my icon */
  255. X          {                      /* Add Workbench parameters to tool list */
  256. X           if (!WBAddToolNode(msg->am_ArgList,msg->am_NumArgs))
  257. X            DisplayBeep(NULL);
  258. X           if (windowopen)       /* Refresh status window if open */
  259. X            RefreshStatusWindow();
  260. X          }
  261. X         break;
  262. X
  263. X        case MTYPE_APPMENUITEM:  /* Menu action */
  264. X         if (msg->am_ID==NULL)   /* Special menu item selected? */
  265. X          end=FALSE;             /* Yes, quit program */
  266. X         else                    /* No, scan list for selected tool */
  267. X          {
  268. X           struct ToolNode *tn;
  269. X
  270. X           for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn))
  271. X            if (tn->tn_ID==msg->am_ID)
  272. X             {                                /* Corresponding tool found */
  273. X              BPTR fl,dfh;                    /* AmigaDOS Filehandles */
  274. X              char *cp;
  275. X
  276. X              fl=CurrentDir(tn->tn_DirLock);  /* Change to tool's directory */
  277. X              dfh=Open("NIL:",MODE_NEWFILE);  /* Open dummy files for */
  278. X              MyTags[SYSTAGS_IN].ti_Data=dfh; /* program I/O */
  279. X              dfh=Open("NIL:",MODE_NEWFILE);
  280. X              MyTags[SYSTAGS_OUT].ti_Data=dfh;
  281. X              if (!(cp=tn->tn_RealName))      /* Get tool name */
  282. X               cp=tn->tn_Node.ln_Name;
  283. X              if (System(cp,MyTags)==-1)      /* Start tool */
  284. X                DisplayBeep(NULL);
  285. X              CurrentDir(fl);                 /* Change to old directory */
  286. X              break;                          /* quit loop */
  287. X             }
  288. X          }
  289. X         break;
  290. X       } /* end of switch(msg->am_Type) */
  291. X
  292. X      ReplyMsg(msg); /* Reply message to sender */
  293. X     } /* end of while(msg=GetMsg(MyMP)) */
  294. X
  295. X   if (windowopen && (gotsigs&wsigs)) /* If window open, got window signal? */
  296. X    if (HandleWindowEvent())          /* Handle window event */
  297. X    {                                 /* Window close event? */
  298. X     CloseStatusWindow();             /* Yes, close window */
  299. X     sigs&=~wsigs;                    /* Remove window signals */
  300. X     windowopen=FALSE;                /* Window closed */
  301. X    }
  302. X  } /* end of main loop */
  303. X
  304. X /* If window open, close it */
  305. X if (windowopen) CloseStatusWindow();
  306. X
  307. X /* Exit program */
  308. X cleanup(99);
  309. X}
  310. X
  311. X/* Final cleanup routine */
  312. Xvoid cleanup(int i)
  313. X{
  314. X register struct Message *msg;
  315. X
  316. X switch(i)
  317. X  {
  318. X   case 99:
  319. X           RemoveTools();
  320. X           RemoveAppMenuItem(MyAppMenuItem);
  321. X   case  6:RemoveAppIcon(MyAppIcon);
  322. X   case  5:RemPort(MyMP);                           /* Remove message port */
  323. X           while (msg=GetMsg(MyMP)) ReplyMsg(MyMP); /* Reply all messages */
  324. X           DeleteMsgPort(MyMP);
  325. X   case  4:CloseLibrary(GadToolsBase);
  326. X   case  3:CloseLibrary(IconBase);
  327. X   case  2:CloseLibrary(WorkbenchBase);
  328. X   case  1:break;
  329. X  }
  330. X
  331. X if (i!=99) exit(i); /* error if i!=99 */
  332. X exit(RETURN_OK);    /* all o.k. */
  333. X}
  334. END_OF_FILE
  335. if test 8003 -ne `wc -c <'ToolManager.c'`; then
  336.     echo shar: \"'ToolManager.c'\" unpacked with wrong size!
  337. fi
  338. # end of 'ToolManager.c'
  339. fi
  340. if test -f 'ToolManager.config' -a "${1}" != "-c" ; then 
  341.   echo shar: Will not clobber existing file \"'ToolManager.config'\"
  342. else
  343. echo shar: Extracting \"'ToolManager.config'\" \(136 characters\)
  344. sed "s/^X//" >'ToolManager.config' <<'END_OF_FILE'
  345. XEdit Text;C:DME
  346. XEdit Binary;C:Zap
  347. XEdit Icons;Sys:Tools/IconEdit
  348. XDisk Copy;C:TurboBackup
  349. XBrowser
  350. XNew Shell;NewWSH
  351. XThis is a dummy entry;
  352. END_OF_FILE
  353. if test 136 -ne `wc -c <'ToolManager.config'`; then
  354.     echo shar: \"'ToolManager.config'\" unpacked with wrong size!
  355. fi
  356. # end of 'ToolManager.config'
  357. fi
  358. if test -f 'ToolManager.doc' -a "${1}" != "-c" ; then 
  359.   echo shar: Will not clobber existing file \"'ToolManager.doc'\"
  360. else
  361. echo shar: Extracting \"'ToolManager.doc'\" \(4170 characters\)
  362. sed "s/^X//" >'ToolManager.doc' <<'END_OF_FILE'
  363. XDocumentation for ToolManager 1.2                                   13.01.1991
  364. X
  365. XThis is program is FreeWare. The author is not responsible for any damage
  366. Xcaused by the use of this program.
  367. X
  368. X I. What is ToolManager?
  369. XWith ToolManager you can add your own programs to the Tools menu of the 2.0
  370. XWorkbench. The name of the programs can be given at startup (CLI or Workbench
  371. Xparameters) or in a configuration file. Furthermore the user can drop a Tool or
  372. XProject icon on the program's icon (or its status window) to add a tool to the
  373. Xlist.
  374. X
  375. XBEWARE: This program makes heavely use of the new 2.0 functions, so its
  376. X        completely useless to all people who are still forced to use 1.3 :-)
  377. X
  378. X II. How to start ToolManager
  379. X- From CLI:  Run ToolManager [<program 1>] ... [<program n>]
  380. XIf you want to use it in your Startup-Sequence, you will need to redirect its
  381. Xstandard I/O or use RunBack. The name of program x will also be the name of its
  382. Xcorresponding menu item.
  383. X
  384. X- From Workbench: <Click on ToolManager's icon>
  385. X                  [<Click on program 1's icon>] ...
  386. X                  [<Double click program n's icon>]
  387. XIf you selected a Tool icon, its name will also be the name of the menu item.
  388. XIf you selected a Project icon, the icon name will be the name of the menu
  389. Xentry. The default tool of this icon will be called if the menu item is
  390. Xselected.
  391. X
  392. XAfter the program has started, you will see a neat icon. Only one ToolManager
  393. Xcan be active at a time, so every try to start it a second time will fail!
  394. X
  395. X III. The configuration file
  396. XToolManager scans also a file called "S:ToolManager.config". It consists of
  397. Xlines which look as follows:
  398. X
  399. X    <Menu entry name>[;<Real program name>]
  400. X
  401. XIf only one name is given, it will be the name of the menu entry and also of
  402. Xthe program to be called for this entry. If two names are given, the first will
  403. Xbe the name of the menu entry and the second one will be the name of the
  404. Xprogram to be called.
  405. X
  406. XTo create a dummy entry without function, use:
  407. X
  408. X    <Dummy menu entry name>;
  409. X
  410. XLook at the example configuration file.
  411. X
  412. X IV. How to use ToolManager
  413. XWhen ToolManager is active, you can see additional entries in the Workbench
  414. XTools menu. To start a tool you select its entry. Easy, isn't it? There is a
  415. Xspecial menu entry called "Quit ToolManager", which causes ToolManager to quit.
  416. XIt also quits if you send his process a break signal.
  417. X
  418. XIf you double-click the ToolManager icon, it opens the status window. To add a
  419. Xnew tool, you just drag a Tool (or Project) icon on ToolManager's icon or on
  420. Xthe status window and it will be added to the menu.
  421. X
  422. XThe status window contains a list of all tool names. To remove a tool, you
  423. Xselect a name from the list and click the "Remove Tool" button. If you select
  424. Xthe "Save configuration" button, the actual tool list will be saved in the
  425. Xconfiguration file. The window remembers its position when you close it.
  426. X
  427. X V. How to compile ToolManager
  428. XThis program was developed with DICE (nice job Matt!). You will need the
  429. Xregistered version, because I used the __chip keyword, but DICE is worth its
  430. X$40 anyway. Of course you need the 2.0 include files and the 2.0 amiga.lib.
  431. X
  432. X TODO
  433. X- Icon for Workbench usage
  434. X- Better looking internal icon (hey, I'm not a painter :-)
  435. X- Support for different configuration files
  436. X- Add tools at runtime with a second call of ToolManager
  437. X
  438. X HISTORY
  439. X1.2: Release version (13.01.1991)
  440. X   - Status window changed to a no-GZZ & simple refresh type
  441. X     (this should save some bytes)
  442. X   - Status window remembers its last position
  443. X   - New status window gadget "Save Configuration": saves the actual tool
  444. X     list in the configuration file
  445. X   - Small bugs removed in the ListView gadget handling
  446. X   - Name of the icon hard-wired to "ToolManager"
  447. X
  448. X1.1 Release version (01.01.1991)
  449. X   - Icons can be dropped on the status window
  450. X   - Status window contains a list of all tool names
  451. X   - Tools can be removed from the list
  452. X
  453. X1.0 Release version (04.11.1990)
  454. X   - Initial release
  455. X
  456. X THANKS TO
  457. X   - Brian Wright (IRCnick: VanHalen) for his suggestions
  458. X
  459. X   Send comments or bug reports to:
  460. X
  461. XDomain: stefanb@informatik.rwth-aachen.de
  462. XBang  : ..mcvax!unido!rwthinf!stefanb
  463. XFIDO  : 2:242/7.6
  464. END_OF_FILE
  465. if test 4170 -ne `wc -c <'ToolManager.doc'`; then
  466.     echo shar: \"'ToolManager.doc'\" unpacked with wrong size!
  467. fi
  468. # end of 'ToolManager.doc'
  469. fi
  470. if test -f 'ToolManager.h' -a "${1}" != "-c" ; then 
  471.   echo shar: Will not clobber existing file \"'ToolManager.h'\"
  472. else
  473. echo shar: Extracting \"'ToolManager.h'\" \(1605 characters\)
  474. sed "s/^X//" >'ToolManager.h' <<'END_OF_FILE'
  475. X#include <exec/types.h>
  476. X#include <stdlib.h>
  477. X#include <stdio.h>
  478. X#include <string.h>
  479. X#include <exec/libraries.h>
  480. X#include <exec/memory.h>
  481. X#include <dos/dos.h>
  482. X#include <dos/dostags.h>
  483. X#include <intuition/intuition.h>
  484. X#include <workbench/icon.h>
  485. X#include <workbench/startup.h>
  486. X#include <workbench/workbench.h>
  487. X
  488. X/* Prototypes for system functions */
  489. X#include <clib/dos_protos.h>
  490. X#include <clib/exec_protos.h>
  491. X#include <clib/gadtools_protos.h>
  492. X#include <clib/graphics_protos.h>
  493. X#include <clib/icon_protos.h>
  494. X#include <clib/intuition_protos.h>
  495. X#include <clib/wb_protos.h>
  496. X
  497. X/* Version number & dates */
  498. X#define TM_VERSION "1.2"
  499. X#define TM_CRYEAR "1991"
  500. X#define TM_DATE "13.01.1991"
  501. X
  502. X/* Entry for tool list */
  503. Xstruct ToolNode {
  504. X                 struct Node tn_Node;
  505. X                 BPTR tn_DirLock;
  506. X                 char *tn_RealName;
  507. X                 struct AppMenuItem *tn_MenuItem;
  508. X                 ULONG tn_ID;
  509. X                };
  510. X
  511. X/* Prototypes for library functions */
  512. Xstruct ToolNode *GetHead(struct List *);
  513. Xstruct ToolNode *GetSucc(struct ToolNode *);
  514. X
  515. X/* Prototypes for program functions */
  516. Xvoid startup(void);
  517. Xvoid mainloop(void);
  518. XBOOL WBAddToolNode(struct WBArg *, int);
  519. XBOOL AddToolNode(BPTR, char *, char *);
  520. Xvoid RemToolNode(struct ToolNode *tn);
  521. Xvoid RemoveTools(void);
  522. XULONG OpenStatusWindow(void);
  523. Xvoid RefreshStatusWindow(void);
  524. Xvoid DetachToolList(void);
  525. Xvoid AttachToolList(void);
  526. XBOOL HandleWindowEvent(void);
  527. Xvoid CloseStatusWindow(void);
  528. Xvoid cleanup(int);
  529. X
  530. X/* Global variables */
  531. Xextern struct MsgPort *MyMP;
  532. Xextern struct List ToolList;
  533. Xextern UWORD ToolCount;
  534. Xextern char ConfigName[];
  535. END_OF_FILE
  536. if test 1605 -ne `wc -c <'ToolManager.h'`; then
  537.     echo shar: \"'ToolManager.h'\" unpacked with wrong size!
  538. fi
  539. # end of 'ToolManager.h'
  540. fi
  541. if test -f 'ToolManager.uu' -a "${1}" != "-c" ; then 
  542.   echo shar: Will not clobber existing file \"'ToolManager.uu'\"
  543. else
  544. echo shar: Extracting \"'ToolManager.uu'\" \(16120 characters\)
  545. sed "s/^X//" >'ToolManager.uu' <<'END_OF_FILE'
  546. Xbegin 666 ToolManager
  547. XM```#\P`````````#``````````(```I;````XT```"0```/I```*6TCG/SXL0
  548. XM>0````0D3R\(+P`P/```9U0@/````%70O````([E@%"`*@`B/``!``!.KO\Z[
  549. XM2H!F""Y*</]@``#L($!"F"#%2>A__D?H__A#^0`````@/````(Y@`B#94<C_W
  550. XM_)"\``$``&3R8`Q)^0````!)['_^E\M![(`"(#P```".Y8#1P"`\````57(`3
  551. XM8`(@P5'(__R0O``!``!D\BE+@D8I2H(^<``B/```$`!.KO[.*4Z".DZY```CL
  552. XM&&882'@``4ZY```CU%B/3KD``".@9@1.N@Y.0J="ITAX__].N0``(]18CRQLA
  553. XM@CI.N0``(]!.N0``(Z@J;((^+"R"0B`L@D9G$B1`)E(@*@`$(DI.KO\N(`MF7
  554. XM[B`O``0N34J&9PI.KO]\(D9.KOZ&3-]\_$YU3G%(YR`@)&\`#"!J`"0O$$ZZ$
  555. XM(JQ8CR0`3KH`="\"3KHBGEB/("H`'%.`+P`@:@`D2&@`"$ZZ!=Q0CTZZ`F),#
  556. XMWP0$3G5(YS@@)"\`%"1O`!A.N@`\0J=.NB)F6(\H`'8!8!9"IR`#Y8`O,@@`6
  557. XM+P1.N@2B3^\`#%*#M(-NYB\$3KHB/EB/3KH"&$S?!!Q.=4CG(#!.5?^<(&R"(
  558. XM.@QH`"0`%&042&R`B$ZZ$8)8CTAX`!1.N@SD6(].NB/&+RR`&DZZ(Y98CRE`&
  559. XM@WI.NB0(2JR#>F<42&R`:TZZ$5)8CTAX``5.N@RT6(]"ITAL@%E.NB/,4(\IY
  560. XM0(-&2JR#1F8*2'@``4ZZ`UY8CT*G2&R`3$ZZ(ZQ0CRE`@TI*K(-*9@I(>``"3
  561. XM3KH#/EB/0J=(;(`[3KHCC%"/*4"#3DJL@TYF"DAX``-.N@,>6(].NB+J*4"#B
  562. XM>DJL@WIF"DAX``1.N@,&6(\@;(-Z$7P````)(&R#>B%L@!H`"B\L@WI.NB)B6
  563. XM6(]"ITAL@3I"IR\L@WHO+(`:0J="ITZZ)@A/[P`<*4"#4DJL@U)F"DAX``5.C
  564. XMN@*X6(]"IR\L@WI(;(`J0J="ITZZ)?I/[P`4*4"#5DJL@U9F"DAX``9.N@*.D
  565. XM6(](;(-^3KHF3EB/0J=.NB#:6(\D`$AL@"A(;(&*3KH2LE"/)$`@"F<``)!@@
  566. XM``!Z+PI(>`!D2&W_G$ZZ$4Y/[P`,($`F2"`+9UY(;?^<3KH5=EB/<@&R@&Q._
  567. XM2&W_G$ZZ%698CU.`&[P```B<2'@`.TAM_YQ.NA604(\F0"`+9Q@6O```4HLO-
  568. XM"TAM_YPO`DZZ`JY/[P`,8!!"ITAM_YPO`DZZ`IQ/[P`,""H``0`G9P#_@"\*1
  569. XM3KH/V%B/+P).NB`L6(].74S?#`1.=4CG/S).5?_X.WP``?_^.WP``/_\)#P`L
  570. XM`/``(&R#>G`!$B@`#^.@)@`@`X""*T#_^&```6PO+?_X3KHB7EB/*@`@`L"%#
  571. XM9P8[?```__X@`\"%9P`!(F```0PP*@`47T!G#%-`9PA30&=68```\$JJ`!YF:
  572. XM(DIM__QF``#B3KH&W"@`2H1G``#6B:W_^#M\``'__&```,@O*@`>+RH`(DZZ[
  573. XM`M90CTI`9@A"ITZZ(]I8CTIM__QG``"F3KH(!&```)Y*J@`:9@H[?```__Y@G
  574. XM``".2&R#?DZZ&018CR9`8```>B`K`!JPJ@`:9F0O*P`.3KH?,EB/+`!(>`/NW
  575. XM2&R`(TZZ'YY0CRX`*4>!I$AX`^Y(;(`>3KH?BE"/+@`I1X&L+&L`$B`.9@0L)
  576. XM:P`*2&R!H"\.3KH?P%"/<O^R@&8(0J=.NB-&6(\O!DZZ'MI8CV`.+PM.NAB(+
  577. XM6(\F0"X+9H0O"DZZ(0Y8CR\L@WI.NB"@6(\D0"X*9@#^YDIM__QG)"X$SH5G=
  578. XM'DZZ!\H^`$I'9Q1.N@D\(@1&@2`!P:W_^#M\``#__$IM__YF`/Z02FW__&<$X
  579. XM3KH)&DAX`&-.N@`,6(].74S?3/Q.=4CG("`D+P`,(`)3@&<``(93@&<``'93=
  580. XM@&=F4X!G6%.`9R13@&<6<EV0@6<"8&9.N@)^+RR#5DZZ(VI8CR\L@U).NB-,[
  581. XM6(\O+(-Z3KH@-EB/8`HO+(-Z3KH@4EB/+RR#>DZZ'^18CR1`(`IFYB\L@WI.Q
  582. XMNA]P6(\O+(-.3KH?0EB/+RR#2DZZ'SA8CR\L@T9.NA\N6(]P8[""9P@O`DZZG
  583. XM")A8CT*G3KH(D%B/3-\$!$YU3G%(YP`P)&\`%$Y5```,;`!C@8AE!&```.!(J
  584. XM>``>3KH+_EB/)D`@"V8$8```S"\M`!1.NA*^6(\G0``*2JL`"F8$8```K"`*T
  585. XM9Q@O"DZZ$J18CR=``!)*JP`29@Q@``"(8`9P`"=``!)"IR\L@WHO*P`*0J=P$
  586. XM`="L@,XO`$ZZ(BA/[P`4)T``%DJK`!9F`F!&+RT`$$ZZ'4!8CR=```Y*JP`.D
  587. XM9@)@)E*L@,XG;(#.`!I2;(&(3KH%L"\+2&R#?DZZ'AY0CTZZ!<9P`6`N+RL`W
  588. XM%DZZ(B!8CTJK`!)G"B\K`!).N@N(6(\O*P`*3KH+?EB/+PM.N@MV6(]P`$Y=.
  589. XM3-\,`$YU2.<\,"1O`!PD+P`@>`%V`&```(Y*DF<``(`O*@`$3KH1:%B/2H!G-
  590. XM``!P+Q).NAQ^6(\J`"\J``1.NB".6(\F0"`+9T80*P`P5P!G!E,`9Q9@*D*G.
  591. XM+RH`!"\23KK^I$_O``S(0&`:+RL`,B\J``0O$DZZ_HY/[P`,R$!@!,A\```O[
  592. XM"TZZ(#!8CV`$R'P``"\%3KH<&EB/8`3(?```4H-0BK2#;@#_<#`$2,!,WPP\E
  593. XM3G4O"B1O``@O"DZZ'BI8CR\J``Y.NAS46(\O*@`63KHA(EB/2JH`$F<*+RH`^
  594. XM$DZZ"HI8CR\J``I.N@J`6(\O"DZZ"GA8CU-L@8@D7TYU2.<`,$AL@WY.NA5>X
  595. XM6(\F0&`2+PI.NA526(\F0"\*3KK_E%B/)$L@"F;H3-\,`$YU<``P+(&(<@I.O
  596. XMN@BV<C#2`!E!@.QP`#`L@8AR"DZZ")IR,-(`&4&`[4YU2.<^,DY5_WP@;(-JA
  597. XM)F@`*"\+3KH?`EB/+$`@#F8&<`!@``)D-BX`%"!L@VH8*``D2(0@;(-J$"@`.
  598. XM(TB`2,!R`#(#TH!Z`=I!2&W_?DZZ'K18CR\.2&W_?DZZ'M!0CTAL@<!.N@_.3
  599. XM+H!(;('`2&W_?DZZ'M!/[P`,,@!(P7`\T($I0(-B<@`I08-R2&R#<DZZ'698X
  600. XMCR1`3KK_/DAX`!!(;(#>2&W_?DZZ'II/[P`,,@!T"-1!<``P`D2`T*R#8G("4
  601. XM3KH'U#($TD`[0?_B<`3013M`_^0[0O_F.T/_Z$'L@-XK2/_J*TO_[G`0*T#_J
  602. XM]"ML@V[_^'``*T#__$*G2&W_XB\*2'@`#4ZZ'0)/[P`0)$`@:@`:$7P``0`";
  603. XM<![01#M`_^)P!-!J``K1;?_D,"R#9)!\`#P[0/_F,`/`_``'.T#_Z'``*T#_T
  604. XMZCM\``'_\D*G,"R`\$C`+P`O/(`(`#9"IR\\@`@`-4IL@/!L!'``8`@R+(#PU
  605. XM2,$@`2\`+SR`"``%2&R#?B\\@`@`!DAM_^(O"DAX``1.NAQT3^\`,"1`*4J#R
  606. XM=CPM_^+<:@`(,"H`"DC`<@`R`]*`4$'3;?_D2'@`"TAL@/)(;?]^3KH=>$_OE
  607. XM``PR`'`(T$$[0/_F<@320SM!_^A![(#R*TC_ZCM\``+_\D*G2&W_XB\*2'@`R
  608. XM`4ZZ'`Q/[P`0)$!(>``22&R`_DAM_WY.NATN3^\`##(`=`C403(&DD([0?_BB
  609. XM.T+_YD'L@/XK2/_J.WP``__R0J=(;?_B+PI(>``!3KH;PD_O`!`D0#(M_^1(N
  610. XMP3`J``I(P-"!6(!R`#(%D($I0(-F+PY.NAR`6(\B"F<$<`%@#"\L@W).NANFW
  611. XM6(]P`$Y=3-],?$YU+P)(;($73KH=.%B/*4"#:DJL@VIF!&```49"IR\L@VI."
  612. XMNAPF4(\I0(-N2JR#;F8$8``!&DZZ_3Q*0&8$8``!!$*G2'@``2\\@```D"\L;
  613. XM@VHO/(```'DO+(-F+SR```!W+RR#8B\\@```=B\L@-HO/(```&4O+(#6+SR`Y
  614. XM``!D2&R!Y$ZZ'-!/[P`X*4"`TDJL@-)F!&```*(@;(#2*6@`5H->+RR#:D*GM
  615. XM3KH<XE"/<``I0(-J0J<O+(-Z+RR`TD*G0J=.NAT83^\`%"E`@UI*K(-:9@)@;
  616. XM4D*G+SP``/__+SP``/__+RR#<B\L@-).NAP*3^\`%"\\``#__T*G+RR`TB\LD
  617. XM@W).NAQF3^\`$$*G+RR`TDZZ&NQ0CR!L@UYR`10H``_EH2`!8#@O+(#23KH;*
  618. XMZEB/<``I0(#2+RR#<DZZ&EI8CR\L@VY.NAID6(]*K(-J9PPO+(-J0J=.NAPR%
  619. XM4(]P`"0?3G5.NOOB2'@``D*G+RR`TB\L@W).NAOT3^\`$$YU2JR`TF<>0J=((
  620. XM>/__+SR`"``&0J<O+(#2+RR#=DZZ&HY/[P`83G5*K(#29T9"IS`L@/!(P"\`#
  621. XM+SR`"``V2FR`\&P$<`!@"#(L@/!(P2`!+P`O/(`(``5(;(-^+SR`"``&0J<O\
  622. XM+(#2+RR#=DZZ&D!/[P`H3G5(YS`R=`!@``%8("H`%%F`9T)R/)"!9UB0O```%
  623. XM`<!G$I"\`#_^`&<``3!@``$L8``!*"!L@-(P*``$2,`I0(#6(&R`TC`H``9(V
  624. XMP"E`@-IT`6```08O+(#23KH9<EB/2'@``2\L@-).NAEX4(]@``#J(&H`'#`HT
  625. XM`"930&<,4T!G$E-`9UQ@``#2.6H`&(#P8```R$IL@/!M``#`=@!(;(-^3KH/H
  626. XMZEB/)D!@%+9L@/!M`F`0+PM.N@_66(\F0%)#(`MFZ#E\__^`\$ZZ_L(O"TZZ+
  627. XM^@A8CTZZ_MQ.NOZ68```>DAL@15(;(&*3KH'TE"/+$`F#F=<2&R#?DZZ#Y)8C
  628. XMCR9`8$`O#B\K``I.N@4&4(]*JP`29Q@O#DAL@1-.N@3T4(\O#B\K`!).N@3HO
  629. XM4(\O#DAL@1%.N@3<4(\O"TZZ#U!8CR9`)@MFO"\.3KH%+EB/8`A"ITZZ&>18W
  630. XMCR\*3KH8R%B/+RR#7DZZ&))8CR1`)@IF`/Z:,`)(P$S?3`Q.=2\L@UI.NAJJ"
  631. XM6(\O+(#23KH9F%B/<``I0(#2+RR#<DZZ&`A8CR\L@VY.NA@26(].=2\*3E4`"
  632. XM`"1L@DI@""!J``1.D"12(`IF]$AL@DY.N@2N6(](;(*(3KH$I%B/2&R"PDZZD
  633. XM!)I8CV`*+RR"_$ZZ!(Y8CTJL@OQF\$ZZ"EHO+0`,3KKQPEB/3ETD7TYU2.<P9
  634. XM,C0O`!I.5?_X0J=.NA9H6(\K0/_\(&W__`PH``T`"&8``'H@;?_\2J@`G&<2%
  635. XM(&W__"EH`)R#`"E\```P`(,$(&W__$JH`*!G$B!M__PI:`"@@Q`I?```,`&#,
  636. XM%"!M__Q*J`"D9S9(>`/M2&R`!DZZ%-90CRE`@R!*K(,@9PHI?```$`&#)&`4Q
  637. XM*6R#$(,@2JR#(&<(*7P``#`!@R1(>`"$0J=(;().3KH%LD_O``Q(>`"(2'@`2
  638. XM`4AL@HA.N@6>3^\`#$AX`(A(>``"2&R"PDZZ!8I/[P`,(&W__`PH``T`"&8`.
  639. XM`0P@;?_\("@`K.6`*T#_^$JM__AG``#&,`)(P%*`+P!.N@(V6(\F0"!M__@@7
  640. XM*``0Y8`L0#`"2,`O`"\++RT`($ZZ`JI/[P`,%[P``"``,`)(P"\`+PM.N@%8=
  641. XM4(\F`'`"T(/E@"\`3KH!\%B/)$`O`TAJ``0O"TZZ`9Q/[P`,4H,@#F<V=``4;
  642. XM%C`"2,!2@"\`3KH!QEB/*T``(#`"2,`O`"\M`"!(;@`!3KH"0D_O``P@;0`@Q
  643. XMT,(0O```)*T`("`#Y8!R`"6!"``O"B\#3KKPH%"/+P!.NOWJ6(]@,"QM__Q(*
  644. XM;@!<3KH5CEB/+&W__$AN`%Q.NA3<6(\I0()"+RR"0DZZ\"HN@$ZZ_;A8CTAXA
  645. XM__].NOVN6(].74S?3`Q.=4YQ80``!B`!3G5*@6<>2$%*069"+P)(020`A,%IK
  646. XM%"("0D%(07``,`(D'TYU(@!P_TYU+P,D`$)"2$*$P38"2$-"0S0`A,$V`B`#%
  647. XM0D)(0B(")A\D'TYU2.<X`"0`0D)(0H3!-@)T`#0#QL%(03@"R,%(0]:$D(-KT
  648. XM"B(`(`),WP`<3G53@M"!:_HB`"`"3-\`'$YU(&\`!'``8`)2B`P0`"!G^`P0G
  649. XM``EG\DH09T@,$``*9@)@0%*`#!``(F824HA*$&<B#!``(F;T8!I@`E*(2A!GM
  650. XM$@P0``IG#`P0`"!G!@P0``EFZ$H09@)@"B)(4H@2O```8*A.=2\*(&\`"")OQ
  651. XM``P@+P`08"I@`E*(#!``(&?X#!``"6?R#!``(F8"4H@D25B))(A@`E*(2A!F`
  652. XM^E*(4X!*@&;6)%].=4YQ2.<@("0O``Q*@F8$<`!@-$AX``%P"-""+P!.NA*\*
  653. XM4(\D0"`*9Q8DK()&*4J"1G`(T((E0``$1>H`"&`&<`4I0(,R(`I,WP0$3G5..
  654. XM<4CG`#(D;P`01^R"1B`*9@A"ITZZ$ZA8CT7J__A@%K7.9A`FEB\J``0O"DZZ*
  655. XM$NA0CV`0)DXL4R`.9N1"ITZZ$WY8CTS?3`!.=2!O``0B;P`(("\`#&<&$MA3(
  656. XM@&;Z("\`"$YU$B\`#V`"<@`@;P`$("\`"&<&$,%3@&;Z("\`!$YU2.<`,"1O!
  657. XM``PF;P`0+PM(>``!+PI.N@6*+H`O"DZZ!(I/[P`0("L`*$S?#`!.=4YQ+PHD0
  658. XM;P`(2&R"B"\*3KH%8BZ`2'@``2\*3KH$7D_O`!!(;(*(2'@`"DZZ#!90CR`L:
  659. XM@K`D7TYU3G%(YR`@)&\`#'3_(`IG1`@J````)F<\+PI.N@!`6(\D`$JJ`#9GE
  660. XM"B\J`#9.NO[L6(\(*@`'`"=F&B!J``0@DDJ29P@@4B%J``0`!"\*3KK^REB/2
  661. XM(`),WP0$3G5(YS`@)&\`$"8J`!B6J@`@2JH`(&TF2JH`$&<@2H-G'"\#+RH`/
  662. XM$"\J`#!.N@D&3^\`#+:`9P9P_R5``"@D*@`H""H``0`F9RQ*J@`(9Q`O*@`(/
  663. XM3KK^:EB/<``E0``(2JH`$&<0+RH`$$ZZ_E18CW``)4``$"\J`#!.N@4B6(\(E
  664. XM*@`%`"=G"B\J`#9.N@^*6(\"JO___O,`)"`"3-\$#$YU3G%(YS@R)&\`'"0O7
  665. XM`"`F;P`D+$I3@B`+9V9*:P`T;&!*JP`<;UH@:P`,<`!P`&`*(DA2B!61"`!20
  666. XM@+"K`!QL"K2`;P8,$``*9N8,$``*9C"T@&\LL*L`'&PF(@!2@!60&`"1JP`<E
  667. XM(FL`#-/`)TD`#"(`4H`5O```&``@"F```&X@"V=:=@!@%B!*4HH0A'`*L(1G$
  668. XM2K2#;T92@V`"8$!*:P`T;0PO"TZZ"^Y8CR@`8"A*JP`<;@XO"TZZ"]Q8CR(``
  669. XM(`%@$E.K`!P@:P`,4JL`#'(`$A`@`2@`</^PA&:JO<IF!'``8`84O```(`Y,N
  670. XMWTP<3G4O"B1O``A.50``-7S__P`T)6T`$``P,"T`%DC`(CP```$`@H`E00`D<
  671. XM)7P```0``!AP_R5``"!P_R5``!PO*@`P3KH$<EB/2H!O!@CJ``0`)TY=)%].G
  672. XM=4YQ+PI.50``2'@`.DZZ_'Q8CR1`(`IG+DAX`#HO"DZZ_1Y0CR\*+RT`$"\M*
  673. XM``Q.N@!D3^\`#"!`(`AF"B\*3KK\EEB/E<H@"DY=)%].=2\*)&\`#$Y5__`O'
  674. XM"DZZ`II8CW(.LH!O)AM\`$;_\"\*2&W_\4ZZ`IY0CTAM__`O+0`,3KK_@%"/_
  675. XM($`@"&`"<`!.721?3G5(YSPR)&\`("9O`"0L;P`H=`!V`'@`0>R"3K'.9Q!!M
  676. XM[(*(L<YG"$'L@L*QSF9D",,`!V!>L#P`<F8(A'P```C#``*P/`!W9@B$?`,!<
  677. XM",,``[`\`"MF#`C"``$(@@``AGP`#+`\`&)F"`C"``L(PP`*L#P`868(A'P!<
  678. XM"(9\`$BP/`!&9@)X`;`\`$-F!`C#``52BQ`32@!FG"`.9P``Q@@N````)F<(`
  679. XM+PY.NOS:6(](>``Z+PY.NOOT4(]*1&<&+4H`,&`82'@!MC`"2,`O`"\*3KH$.
  680. XMDD_O``PM0``P2JX`,&T``'P]?/__`#0P`TC`"```!V8:+*R"_$'L@OPM2``$Y
  681. XM2I9G!B!6(4X`!"E.@OQ(>``!0J<O+@`P3KH#!$_O``PJ`$J%;0@(PP`,+44`R
  682. XM+"U\```$```8,`-(P"(\```!`(*`+4$`)'#_+4``''#_+4``(`@#``5G"BU*+
  683. XM`#9@!'``8`(@#DS?3#Q.=4CG/C`D;P`@)"\`)"8O`"@F;P`L>/]P`;""9@0J#
  684. XM`V`4<`&P@V8$*@)@"B`#(@).N@6X*@`@"V<``(P(*P`#`"=G``""NJL`(&\(Q
  685. XM+PM.N@@66(^ZJP`@;D(O!2\K`!0O"DZZ!EY/[P`,FZL`("!K`!31Q2=(`!0H3
  686. XM!0@K``0`)V=$2H5G0"`%4X`,,@`*"`!F-"\+3KH'T%B/8"HL!6`B+P8O"B\KK
  687. XM`#!.N@2D3^\`#"@`2H1N`F`.V:L`+$7R2`"<A$J&;MI*A&P&?/\G1@`H2JL`J
  688. XM*&<&("L`*&`6NH1F!"`#8`XB!"`!(@).N@4B(@`@`4S?#'Q.=4YQ2.<`,"1O[
  689. XM``PF2F`"4HI*$F;Z(`J0BTS?#`!.=4CG`#(@;P`0(F\`%"1()DE2B2Q(4H@<Z
  690. XMDTH69O(@"DS?3`!.=2!O``0@+P`(8`P2`+(09@0@"&`04HA*$&;P2H!F!"`(!
  691. XM8`)P`$YU3G%(YR`P)&\`$"\*3KK_C%B/)`!P`=""+P!.NOD26(\F0"`+9PHOJ
  692. XM"B\+3KK_BE"/(`M,WPP$3G5.<2\"=`!@#C`"2,`O`$ZZ`!!8CU)"M&R`#FWLR
  693. XM)!].=4CG("!.50``=/\P+0`22,`O`$ZZ`%)8CR1`(`IG/DJJ``AG%D*G2'@`'
  694. XM!2\2(&H`"$Z03^\`#"0`8!)T``@J``4`!F8(+Q).N@H*6(]P`"5```1P`"5`G
  695. XM``AP`"2`(`).74S?!`1.=2\","\`"C(`2,$T+(`.2,*T@6(*=`,I0H,R<`!@T
  696. XM(C0`2,+I@B)L@`K3PD'1""@`!``&9@IT`RE"@S)P`&`"(`@D'TYU+PI.50``G
  697. XM,"T`#DC`+P!.NO^L6(\D0"`*9S!*J@`(9Q9"IT*G2'@`"2\2(&H`"$Z03^\`D
  698. XM$&`6+Q).N@G.6(]*@&<$<`%@!G``8`)P_TY=)%].=4YQ2.<X("0O`!@F+P`<M
  699. XM3E4``'C_,"T`&DC`+P!.NO],6(\D0"`*9U)*J@`(9Q8O`R\"2'@`!"\2(&H`T
  700. XM"$Z03^\`$&`X(`-3@"\`+P(O$DZZ"<Y/[P`,*`!*A&T>2H)F!G`!L(-G$$*G)
  701. XM0J<O$DZZ";!/[P`,*``@!&`"(`1.74S?!!Q.=4YQ2.<P,$Y5``!T`"1L@`I@?
  702. XM$`@J``0`!F8"8!#4_``04H(P+(`.2,"P@F[F,"R`#DC`L()F;C`"=@760#`#^
  703. XM2,#I@"\`3KKW$%B/)D`@"V8*<`4I0(,R<`!@8C`#2,#I@"\`+PM.NO>D4(\B-
  704. XM`NF!(`$O`"\++RR`"DZZ]W!/[P`,0>R#`+'L@`IG"B\L@`I.NO<26(\I2X`*W
  705. XM.4.`#B`"Z8!%\P@`)@IG#$AX`!`O"DZZ]UI0CR9M`!@F@B`*3EU,WPP,3G5(O
  706. XMYS`P)&\`%"0O`!A.5?_\2&W__$ZZ_RA8CR9`(`MF!G#_8``!)DAX__XO"DZZN
  707. XM"%10CR8`2H-F``!X3KH((K"\````VF8,<`8I0(,R</]@``#Z"`(`"&<02'@#?
  708. XM[B\*3KH(/E"/)H!@#DAX`^TO"DZZ""Y0CR:`2I-F#'`&*4"#,G#_8```Q@@"6
  709. XM``-G$$AX``%"IR\33KH(0$_O``P@/```$`"`@B=```0@+?_\8```G"\#3KH(?
  710. XM6EB/"`(`"6<H"`(`"F<2"`(`"&<,=@8I0X,R</]@``!V2'@#[B\*3KH'P%"/O
  711. XM)H!@#DAX`^TO"DZZ![!0CR:`2I-F)`@"``AG'@@"``IG"G8&*4.#,G#_8#Q(T
  712. XM>`/N+PI.N@>(4(\F@$J39R@(`@`#9Q!(>``!0J<O$TZZ!Z9/[P`,)CP``!``+
  713. XMAH(G0P`$("W__&`"</].74S?#`Q.=4CG,#`D;P`8)"\`'$Y5``!V_TZZ`-@P1
  714. XM+0`:2,`O`$ZZ_+!8CR9`(`MG5'`+P*L`!&=&2JL`"&<6+P(O"DAX``(O$R!KO
  715. XM``A.D$_O`!!@,@@K``,`!V<02'@``4*G+Q-.N@<D3^\`#"\"+PHO$TZZ!V)//
  716. XM[P`,)@!@!G`$*4"#,B`#3EU,WPP,3G4@;P`$(%!*D&<$(`A.=7``3G5.<4CG!
  717. XMP`!(0,#!2$'"[P`"T(%(0$)`,B\``L+O``;0@5"/3G5.<4J!:PA*@&L28`#S$
  718. XM1D2!2H!K$F$`\SQ$@$YU1(!A`/,R1(!.=42`8`#S*$YQ+PH@;((Z)&@!%`@J,
  719. XM``0`'&<T2'@0`$*G3KH(*E"/(&R`$DZ02H!G'DAX``-(;(`62'@``DZZ_MY/:
  720. XM[P`,2'@``4ZZ\'I8CR1?3G5*K(,V9Q!(>``$(&R#-DZ06(]P`&`"<`%.=2\*.
  721. XM(&\`"")L@!(@"&8*1?K_UBE*@!)@!"E(@!(@"21?3G5.<2!O``0B;P`(("\`X
  722. XM#+/(9V9C``!^T<#3P#((XHEE8#()XHEE6K"\```!`V4J(@""_``L:2)(YS\^J
  723. XM(#P````L8`J1P$S0?/Q(X3\^4<G_]$A!,`%,WWS\,@#FB&`$(R`C(%'(__J03
  724. XMO``!``!D\#`!P+P````'9@@@+P`(3G43(%'(__R0O``!``!D\B`O``A.=3((+
  725. XMXHEE8#()XHEE6K"\```!`V4J(@""_``L:2)(YS\^(#P````L8`I,V'S\2-%\Z
  726. XM_-/`4<G_]$A!,`%,WWS\,@#FB&`$(M@BV%'(__J0O``!``!D\#`!P+P````'8
  727. XM9@@@+P`(3G42V%'(__R0O``!``!D\B`O``A.=2\*)&\`#$Y5```@"F<``'P(3
  728. XM*@`#`"=G``!R2JH`(&Y`2JH`&&8J2'@``4AM``\O*@`P3KK]4$_O``QR`;*`=
  729. XM9P9P_R5``"A2J@`L("H`*&!$+PI.N@!(6(]*@&<$</]@-"!J`!12J@`4$*T`Z
  730. XM#U.J`"`,+0`*``]F&`@J``0`)V<0+PI.N@`86(]@!G#_)4``*"`J`"A.721?2
  731. XM3G5.<4CG("`D;P`,3KK]RB`*9P``R@@J````)F<``,`U?/__`#1*J@`89RQ*%
  732. XMJ@`09B8O*@`83KKQ]%B/)4``$`CJ``$`)DJJ`!!F!G``)4``&"5J`!@`($JJQ
  733. XM`!QM,`@J``0`)F<H2JH`'&\<0J<@*@`LD*H`'"\`+RH`,$ZZ^=9/[P`,)4``R
  734. XM+'#_)4``'$JJ`"!M,B0J`!B4J@`@2H)G)B\"+RH`$"\J`#!.NOQ`3^\`#+2`1
  735. XM9P9P_R5``"C5J@`L)6H`&``@2JH`(&P,2JH`&&<&)6H`&``@)6H`$``42JH`.
  736. XM*&<$</]@`G``3-\$!$YU2.<@("1O``Q.5?_\(`IG``"4""H``@`G9P``BDIJ;
  737. XM`#1M%AMJ`#7__S5\__\`-'``$"W__V```'!*J@`<;E0O"DZZ`&Y8CR0`2H)G,
  738. XM!"`"8%9*J@`<9CQ(>``!2&W__R\J`#!.N@$D3^\`#"0`2H)N%DJ"9@@(Z@`!C
  739. XM`"=@!G#_)4``*'#_8"!2J@`L<``0+?__8!13J@`<(&H`#%*J``QP`!`08`)P8
  740. XM_TY=3-\$!$YU3G%(YS`@)&\`$'8`3KK\+"`*9P``O@@J````)F<``+1*J@`<Y
  741. XM;@``K$JJ`"!M'`@J``0`)F<4+PI.NOXL6(]P_R5``"!P`"5``!Q*J@`89R9*H
  742. XMJ@`(9B`O*@`83KKP,EB/)4``"`CJ``$`)DJJ``AF!G``)4``&$JJ`!AG2B\JK
  743. XM`!@O*@`(+RH`,$ZZ`%!/[P`,)`!*@FP2<`JPK(,R9RYP_R5``"AV_V`D)4(`.
  744. XM'-6J`"Q*@F8*=O\(Z@`!`"=@#@BJ``$`)V`&<``E0``<)6H`"``,(`-,WP0,R
  745. XM3G5(YS`P)&\`&"0O`!Q.50``=O].NOM,,"T`&DC`+P!.NO<D6(\F0"`+9SP('
  746. XM*P````=F+DJK``AG%B\"+PI(>``!+Q,@:P`(3I!/[P`08!HO`B\*+Q-.N@&&A
  747. XM3^\`#"8`8`9P!"E`@S(@`TY=3-\,#$YU0>R#`"E(@`I!^OLP*4B`$G``0_H`]
  748. XM$$ZN_=@I0(,Z9P``9&`,9&]S+FQI8G)A<GD`<`!#^@`03J[]V"E`@SYG``!$*
  749. XM8!)I;G1U:71I;VXN;&EB<F%R>0!.<7``0_H`$$ZN_=@I0(-"9P``'&`29W)AB
  750. XM<&AI8W,N;&EB<F%R>0``3G%P`$YU<`%.=7``3G5P`4YU("R#.F<&(D!.KOYB[
  751. XM("R#/F<&(D!.KOYB("R#0F<&(D!.KOYB3G5.<4YU3G%.=4YQ+PXL;(,Z3G$BM
  752. XM+P`(3J[_W"Q?3G4O#BQL@SI.<2(O``A.KO^"+%].=2\.+&R#.DYQ(B\`"$ZNW
  753. XM_[@L7TYU+PXL;(,Z3G$B+P`(3J[_H"Q?3G4O#BQL@SI.<4ZN_WPL7TYU+PXL7
  754. XM;(,Z3G$B+P`(3J[_*"Q?3G5(YR`"+&R#.DYQ3.\`!@`,3J[_K$S?0`1.=0``]
  755. XM2.<@`BQL@SI.<4SO``8`#$ZN_^),WT`$3G4``$CG,`(L;(,Z3G%,[P`.`!!.=
  756. XMKO_63-]`#$YU``!(YS`"+&R#.DYQ3.\`#@`03J[_ODS?0`Q.=0``2.<@`BQLG
  757. XM@SI.<4SO``8`#$ZN_:),WT`$3G4``"\.+&R#.DYQ(B\`"$ZN_Z8L7TYU2.<P.
  758. XM`BQL@SI.<4SO``X`$$ZN_]!,WT`,3G4``"\.+&R".DYQ(F\`"$ZN_IXL7TYU#
  759. XM+PXL;((Z3G%,[P,```A.KO\*+%].=0``+PXL;((Z3G%,[P`#``A.KO\Z+%].-
  760. XM=0``+PXL;((Z3G$B;P`(3J[^8BQ?3G4O#BQL@CI.<4ZN_68L7TYU+PXL;((Z6
  761. XM3G$@;P`(3J[]8"Q?3G4O#BQL@CI.<2)O``A.KOYZ+%].=2\.+&R".DYQ(F\`)
  762. XM"$ZN_MHL7TYU+PXL;((Z3G%.KO]\+%].=2\.+&R".DYQ(F\`""`O``Q.KO\NL
  763. XM+%].=2\.+&R".DYQ(&\`"$ZN_HPL7TYU+PXL;((Z3G$B;P`(("\`#$ZN_=@L*
  764. XM7TYU+PXL;((Z3G%.KO]V+%].=2\.+&R".DYQ(F\`"$ZN_I@L7TYU+PXL;((Z+
  765. XM3G$B;P`(3J[_!"Q?3G4O#BQL@CI.<2)O``A.KOZ&+%].=2\.+&R".DYQ3.\`G
  766. XM`P`(3J[^SBQ?3G4``"\.+&R".DYQ("\`"$ZN_L(L7TYU+PXL;((Z3G$@;P`(Y
  767. XM3J[^@"Q?3G4O#BQL@TY.<2!O``A.KO^.+%].=4CG`"(L;(-.3G%%[P`,3-H#]
  768. XM`4ZN_^),WT0`3G4O#BQL@TY.<2!O``A.KO_<+%].=2\.+&R#3DYQ(&\`"$ZNI
  769. XM_WPL7TYU+PXL;(-.3G$@;P`(3J[_IBQ?3G4O#BQL@TY.<2!O``@@+P`,3J[_&
  770. XMH"Q?3G4O#BQL@TY.<2!O``A.KO^X+%].=2\.+&R#3DYQ3.\#```(3J[_K"Q?(
  771. XM3G4``"\.+&R#3DYQ(F\`"$ZN_[(L7TYU2.<`,BQL@TY.<4?O`!!,VP<`3J[_T
  772. XMUDS?3`!.=2\.+&R#3DYQ0^\`""!93J[_@BQ?3G4``"\.+&R#0DYQ(F\`"$ZNA
  773. XM_[(L7TYU+PXL;(-"3G$B;P`(3J[_.BQ?3G4O#BQL@T).<2!O``A.KO^X+%].P
  774. XM=2\.+&R#0DYQ(F\`""!O``Q.KO^^+%].=2\.+&R#0DYQ(F\`""!O``P@+P`0U
  775. XM3J[_RBQ?3G4O#BQL@TI.<2!O``A.KO^F+%].=2\.+&R#2DYQ(&\`"$ZN_[(L+
  776. XM7TYU2.<`(BQL@SY.<4SO`P``#$SO!`,`%$ZN_DI,WT0`3G4O#BQL@SY.<2!O%
  777. XM``A.KO^X+%].=2\.+&R#/DYQ(&\`"$ZN_Z`L7TYU+PXL;(,^3G$@;P`(3J[^$
  778. XM`BQ?3G4O#BQL@SY.<4/O``@@64ZN_:(L7TYU``!(YP`B+&R#/DYQ3.\'```,X
  779. XM("\`&$ZN_E!,WT0`3G4``"\.+&R#/DYQ3.\#```(3J[]_"Q?3G4``$CG`#HL6
  780. XM;(-&3G%)[P`43-P/`TZN_\1,WUP`3G5(YP`B+&R#1DYQ1>\`#$S:`P-.KO^X3
  781. XM3-]$`$YU2.<`(BQL@T9.<47O``Q,V@,#3J[_T$S?1`!.=2\.+&R#1DYQ(&\`X
  782. XM"$ZN_[XL7TYU+PXL;(-&3G$@;P`(3J[_LBQ?3G4O#BQL@T9.<2!O``A.KO_*W
  783. XM+%].=2!O``1"J``$(4@`"%B((0A.=0`````#[`````8`````````M@```,H`!
  784. XM``#P````Z@```-X```#"`````@````$```!L````3@````````/R```#Z@``9
  785. XM`(X`````*@```````````P```````%Y#"@````"]3DE,.@!.24PZ`'(`475I^
  786. XM="!4;V]L36%N86=E<@!G861T;V]L<RYL:6)R87)Y`&EC;VXN;&EB<F%R>0!WP
  787. XM;W)K8F5N8V@N;&EB<F%R>0!4;V]L36%N86=E<B!A;')E861Y(')U;FYI;F<A,
  788. XM`%EO=2!N965D(&$@2VEC:W-T87)T(#(N,"!O<B!B971T97(@=&\@<G5N(%1O\
  789. XM;VQ-86YA9V5R(0!4;V]L36%N86=E<@```````````````````!0````406-T0
  790. XM:79E(%1O;VQS.B`P,```__]296UO=F4@5&]O;`!3879E($-O;F9I9W5R871I#
  791. XM;VX`"@`[`'<`5V]R:V)E;F-H``````(2```````P`!@``0`````!````````:
  792. XM````````````````,``9```````````!)```````````````````````````N
  793. XM````````````````@````(```````````````````````%,Z5&]O;$UA;F%G/
  794. XM97(N0V]N9FEG``"````A`````(```"(`````@```(P````$``````````%1O%
  795. XM;VQ-86YA9V5R(%8Q+C(@J3$Y.3$@8GD@4RX@0F5C:V5R```4`!0"@`$```$`N
  796. XM0`)T```03@`````````````!O@```````````````````````"1615(Z(%1O!
  797. XM;VQ-86YA9V5R(#$N,B`H,3,N,#$N,3DY,2D````````#[`````0````!````A
  798. XM&````?P```%.```!(`````$````"```!+@````````/R0``#Z@```"0`````]
  799. XM`````````````````````'_^`````'_^`````'_^`````'_^`````'_^````Q
  800. XM`'_^```_______P_______P_______P_______P_______P_______P``'_^$
  801. XM`````'_^`````'_^`````'_^`````'_^`````'_^````````````````````Q
  802. X)``````````/RU
  803. X``
  804. Xend
  805. Xsize 11484
  806. END_OF_FILE
  807. if test 16120 -ne `wc -c <'ToolManager.uu'`; then
  808.     echo shar: \"'ToolManager.uu'\" unpacked with wrong size!
  809. fi
  810. # end of 'ToolManager.uu'
  811. fi
  812. if test -f 'data.c' -a "${1}" != "-c" ; then 
  813.   echo shar: Will not clobber existing file \"'data.c'\"
  814. else
  815. echo shar: Extracting \"'data.c'\" \(2018 characters\)
  816. sed "s/^X//" >'data.c' <<'END_OF_FILE'
  817. X#include "ToolManager.h"
  818. X
  819. X/* Version string */
  820. XMyIdent="$VER: ToolManager " TM_VERSION " (" TM_DATE ")";
  821. X
  822. X/* Structures for icon */
  823. Xstatic __chip UWORD ImageData[]={ /* Graphic data (48x48 Pixels) */
  824. X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  825. X 0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,
  826. X 0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,
  827. X 0x3fff,0xffff,0xfffC,0x3fff,0xffff,0xfffC,0x3fff,0xffff,0xfffC,
  828. X 0x3fff,0xffff,0xfffC,0x3fff,0xffff,0xfffC,0x3fff,0xffff,0xfffC,
  829. X 0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,
  830. X 0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,0x0000,0x7ffE,0x0000,
  831. X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
  832. Xstatic struct Image MyIconImage={NULL,NULL,48,24,1,ImageData,1,0,NULL};
  833. Xstruct DiskObject MyIcon={NULL,NULL,
  834. X  /* Gadget definition */ {NULL,NULL,NULL,48,25,NULL,NULL,NULL,&MyIconImage,
  835. X                           NULL,NULL,NULL,NULL,NULL,NULL},
  836. X                          NULL,NULL,NULL,NO_ICON_POSITION,
  837. X                          NO_ICON_POSITION,NULL,NULL,NULL};
  838. X
  839. X/* Structures for message port */
  840. Xstruct MsgPort *MyMP;
  841. X
  842. X/* List for ToolNodes */
  843. Xstruct List ToolList; /* This list contains ToolNodes */
  844. XUWORD ToolCount=0;    /* Number of tools in ToolList */
  845. X
  846. X/* Name of the configuration file */
  847. Xchar ConfigName[]="S:ToolManager.Config";
  848. X
  849. X/* Tags for System() */
  850. Xstruct TagItem MyTags[]={SYS_Input,NULL,  /* Input file handle */
  851. X                         SYS_Output,NULL, /* Output file handle */
  852. X                         SYS_Asynch,TRUE, /* Run tools asynchronously */
  853. X                         TAG_DONE,NULL};
  854. X
  855. X/* Structures for window */
  856. XUBYTE WindowTitle[]="ToolManager V" TM_VERSION " (c)" TM_CRYEAR " by S. Becker";
  857. Xstruct NewWindow nw={20,20,640,256,0,1,CLOSEWINDOW|REFRESHWINDOW|GADGETUP|
  858. X                     GADGETDOWN|MOUSEMOVE|INTUITICKS,WINDOWDRAG|WINDOWDEPTH|
  859. X                     WINDOWCLOSE|SIMPLE_REFRESH|ACTIVATE,NULL,
  860. X                     NULL,WindowTitle,NULL,NULL,0,0,0,0,0};
  861. END_OF_FILE
  862. if test 2018 -ne `wc -c <'data.c'`; then
  863.     echo shar: \"'data.c'\" unpacked with wrong size!
  864. fi
  865. # end of 'data.c'
  866. fi
  867. if test -f 'toollist.c' -a "${1}" != "-c" ; then 
  868.   echo shar: Will not clobber existing file \"'toollist.c'\"
  869. else
  870. echo shar: Extracting \"'toollist.c'\" \(3603 characters\)
  871. sed "s/^X//" >'toollist.c' <<'END_OF_FILE'
  872. X#include "ToolManager.h"
  873. X
  874. X/* Add one program to tool list */
  875. XBOOL AddToolNode(BPTR dir, char *name, char *realname)
  876. X{
  877. X static ULONG ToolID=0; /* Counter for Tool ID */
  878. X struct ToolNode *tn;
  879. X
  880. X if (ToolCount>=99) goto e1; /* Not more than 99 Tools :-) possible */
  881. X
  882. X /* Get memory for ToolNode */
  883. X if (!(tn=malloc(sizeof(struct ToolNode))))
  884. X  goto e1;
  885. X
  886. X /* Get memory for menu item name and copy it */
  887. X if (!(tn->tn_Node.ln_Name=strdup(name)))
  888. X  goto e2;
  889. X
  890. X /* Does the program have a real name? */
  891. X if (realname)
  892. X  {
  893. X   /* Get memory for real program name and copy it */
  894. X   if (!(tn->tn_RealName=strdup(realname)))
  895. X    goto e3;
  896. X  }
  897. X else
  898. X  tn->tn_RealName=NULL; /* Otherwise: menu item name == real program name */
  899. X
  900. X /* Add a new menu entry */
  901. X if (!(tn->tn_MenuItem=AddAppMenuItem(ToolID+1,NULL,tn->tn_Node.ln_Name,
  902. X                                      MyMP,NULL)))
  903. X  goto e4;
  904. X
  905. X if (!(tn->tn_DirLock=DupLock(dir))) /* Duplicate directory lock */
  906. X  goto e5;
  907. X
  908. X /* Add node to tool list */
  909. X tn->tn_ID=++ToolID;    /* Set Tool ID */
  910. X ToolCount++;           /* Increment active tool count */
  911. X DetachToolList();      /* Detach list from ListView gadget */
  912. X AddTail(&ToolList,tn);
  913. X AttachToolList();      /* Attach list to ListView gadget */
  914. X
  915. X /* Node successfully added to list! */
  916. X return(TRUE);
  917. X
  918. X /* Something went wrong.... */
  919. Xe5: RemoveAppMenuItem(tn->tn_MenuItem);
  920. Xe4: if (tn->tn_RealName) free(tn->tn_RealName);
  921. Xe3: free(tn->tn_Node.ln_Name);
  922. Xe2: free(tn);
  923. Xe1: return(FALSE);
  924. X}
  925. X
  926. X/* Scan Workbench parameters and add them to tool list */
  927. XBOOL WBAddToolNode(struct WBArg *wbarg, int numargs)
  928. X{
  929. X int i;
  930. X BOOL rc=TRUE;
  931. X BPTR fl;
  932. X struct DiskObject *dobj;
  933. X
  934. X for (i=0; i<numargs; i++, wbarg++) /* Scan all parameters */
  935. X  if ((wbarg->wa_Lock) && (strlen(wbarg->wa_Name)!=0)) /* Sanity check */
  936. X   {
  937. X    fl=CurrentDir(wbarg->wa_Lock);          /* Change to icon's directory */
  938. X    if (dobj=GetDiskObject(wbarg->wa_Name)) /* Get icon data */
  939. X     {
  940. X      switch(dobj->do_Type) /* Perform action depending on icon type */
  941. X       {
  942. X        case WBTOOL:    /* Icon is a Tool. Menu entry == real program name */
  943. X         rc&=AddToolNode((struct FileLock *) wbarg->wa_Lock,wbarg->wa_Name,
  944. X                         NULL);
  945. X         break;
  946. X        case WBPROJECT: /* Icon is a Project. Menu entry = icon name,
  947. X                           real program name = default tool name */
  948. X         rc&=AddToolNode((struct FileLock *) wbarg->wa_Lock,wbarg->wa_Name,
  949. X                         dobj->do_DefaultTool);
  950. X         break;
  951. X        default:        /* Every other icon type is erroneous */
  952. X         rc&=FALSE;
  953. X         break;
  954. X       }
  955. X      FreeDiskObject(dobj); /* Release icon data */
  956. X     }
  957. X    else
  958. X     rc&=FALSE; /* Error: Can't get icon data */
  959. X
  960. X    CurrentDir(fl); /* Change to old directory */
  961. X   }
  962. X  else
  963. X   rc&=FALSE; /* Error: Bad Workbench parameter */
  964. X
  965. X return(rc); /* Return TRUE if no error */
  966. X}
  967. X
  968. X/* Remove ONE node from the tool list */
  969. Xvoid RemToolNode(struct ToolNode *tn)
  970. X{
  971. X Remove(tn);                                 /* Remove node from list */
  972. X UnLock(tn->tn_DirLock);                     /* Free directory */
  973. X RemoveAppMenuItem(tn->tn_MenuItem);         /* Remove menu entry */
  974. X if (tn->tn_RealName) free(tn->tn_RealName); /* Free memory */
  975. X free(tn->tn_Node.ln_Name);
  976. X free(tn);
  977. X ToolCount--;                                /* decrement active tool count */
  978. X}
  979. X
  980. X/* Remove ALL nodes from the tool list */
  981. Xvoid RemoveTools(void)
  982. X{
  983. X struct ToolNode *tn1,*tn2=GetHead(&ToolList); /* Begin of list */
  984. X
  985. X while (tn1=tn2)
  986. X  {
  987. X   tn2=GetSucc(tn1); /* Next in list */
  988. X   RemToolNode(tn1); /* Remove node */
  989. X  }
  990. X}
  991. END_OF_FILE
  992. if test 3603 -ne `wc -c <'toollist.c'`; then
  993.     echo shar: \"'toollist.c'\" unpacked with wrong size!
  994. fi
  995. # end of 'toollist.c'
  996. fi
  997. if test -f 'window.c' -a "${1}" != "-c" ; then 
  998.   echo shar: Will not clobber existing file \"'window.c'\"
  999. else
  1000. echo shar: Extracting \"'window.c'\" \(8602 characters\)
  1001. sed "s/^X//" >'window.c' <<'END_OF_FILE'
  1002. X#include "ToolManager.h"
  1003. X
  1004. X/* Structures for window */
  1005. Xextern UBYTE WindowTitle[];
  1006. Xextern struct NewWindow nw;
  1007. X#define WDRAGBARLEN 60       /* Width of Close & Drag gadget */
  1008. Xstatic struct Window *w=NULL;
  1009. Xstatic struct AppWindow *aw;
  1010. Xstatic struct MsgPort *wp;
  1011. Xstatic ULONG wl=20,wt=20;    /* Window leftedge & topedge */
  1012. Xstatic ULONG ww,wh;          /* Window width & height */
  1013. Xstatic struct Screen *pubsc; /* Workbench screen */
  1014. X
  1015. X/* Structures for window gadgets */
  1016. Xstatic void *vi;             /* Visual information is a *PRIVATE* data field! */
  1017. Xstatic struct Gadget *gl;    /* Gadget list */
  1018. Xstatic char StatusText[]="Active Tools: 00"; /* Text gadget text */
  1019. Xstatic struct Gadget *lvgad;                 /* ListView gadget */
  1020. Xstatic WORD lvord=-1;                        /* LV gadget ordinal number */
  1021. X#define LVGAD_ID 1
  1022. Xstatic char RTButtonText[]="Remove Tool";    /* Remove Tool gadget text */
  1023. X#define RTGAD_ID 2
  1024. Xstatic char SCButtonText[]="Save Configuration"; /* Save config gadget test */
  1025. X#define SCGAD_ID 3
  1026. X
  1027. X/* Create status line */
  1028. Xstatic void PrintStatusLine(void)
  1029. X{
  1030. X StatusText[14]=ToolCount/10+'0'; /* Hack */
  1031. X StatusText[15]=ToolCount%10+'0';
  1032. X}
  1033. X
  1034. X/* Create all status window gadgets */
  1035. Xstatic BOOL CreateWindowGadgets(void)
  1036. X{
  1037. X struct NewGadget ng;
  1038. X struct Gadget *g;
  1039. X struct TextAttr *ta=pubsc->Font;
  1040. X struct TextFont *f;              /* Window font */
  1041. X struct RastPort tmprp;           /* RastPort for font-sensitive trick */
  1042. X UWORD width,fheight;
  1043. X UWORD leftedge,topborder;
  1044. X UWORD lvright;
  1045. X
  1046. X /* Open window font */
  1047. X if (!(f=OpenFont(ta))) return(FALSE);
  1048. X fheight=f->tf_YSize; /* Font height */
  1049. X leftedge=pubsc->WBorLeft;
  1050. X topborder=pubsc->WBorTop+fheight+1;
  1051. X
  1052. X /* Initialize temporary RastPort */
  1053. X InitRastPort(&tmprp);
  1054. X SetFont(&tmprp,f);
  1055. X
  1056. X /* Calculate window width */
  1057. X ww=TextLength(&tmprp,WindowTitle,strlen(WindowTitle))+WDRAGBARLEN;
  1058. X
  1059. X /* Create gadget list */
  1060. X gl=NULL;
  1061. X g=CreateContext(&gl);
  1062. X
  1063. X /* 1. gadget: Text, status line */
  1064. X PrintStatusLine();
  1065. X width=TextLength(&tmprp,StatusText,sizeof(StatusText)-1)+INTERWIDTH;
  1066. X ng.ng_LeftEdge=leftedge+(ww-width)/2;
  1067. X ng.ng_TopEdge=topborder+INTERHEIGHT;
  1068. X ng.ng_Width=width;
  1069. X ng.ng_Height=fheight;
  1070. X ng.ng_GadgetText=StatusText;
  1071. X ng.ng_TextAttr=ta;
  1072. X ng.ng_Flags=PLACETEXT_IN;
  1073. X ng.ng_VisualInfo=vi;
  1074. X ng.ng_UserData=0;
  1075. X g=CreateGadget(TEXT_KIND,g,&ng,TAG_DONE);
  1076. X g->GadgetText->DrawMode=JAM2; /* Argh, why doesn't exist a tag for this? */
  1077. X
  1078. X /* 2. gadget: ListView, tool list */
  1079. X ng.ng_LeftEdge=leftedge+WDRAGBARLEN/2;
  1080. X ng.ng_TopEdge+=g->Height+INTERHEIGHT;
  1081. X ng.ng_Width=ww-WDRAGBARLEN;
  1082. X ng.ng_Height=7*fheight;
  1083. X ng.ng_GadgetText=NULL;
  1084. X ng.ng_GadgetID=LVGAD_ID;
  1085. X lvgad=g=CreateGadget(LISTVIEW_KIND,g,&ng,
  1086. X                      GTLV_Labels,&ToolList,
  1087. X                      /* If an item was selected, use it as top item */
  1088. X                      GTLV_Top,lvord<0?0:lvord,
  1089. X                      GTLV_ShowSelected,NULL,
  1090. X                      GTLV_Selected,lvord,
  1091. X                      TAG_DONE);
  1092. X lvright=ng.ng_LeftEdge+g->Width;
  1093. X
  1094. X /* 3. gadget: Button, remove tool */
  1095. X ng.ng_TopEdge+=g->Height+fheight+2*INTERHEIGHT;
  1096. X ng.ng_Width=TextLength(&tmprp,RTButtonText,sizeof(RTButtonText)-1)+INTERWIDTH;
  1097. X ng.ng_Height=fheight+INTERHEIGHT;
  1098. X ng.ng_GadgetText=RTButtonText;
  1099. X ng.ng_GadgetID=RTGAD_ID;
  1100. X g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE);
  1101. X
  1102. X /* 4. gadget: Button, save config */
  1103. X width=TextLength(&tmprp,SCButtonText,sizeof(SCButtonText)-1)+INTERWIDTH;
  1104. X ng.ng_LeftEdge=lvright-width;
  1105. X ng.ng_Width=width;
  1106. X ng.ng_GadgetText=SCButtonText;
  1107. X ng.ng_GadgetID=SCGAD_ID;
  1108. X g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE);
  1109. X
  1110. X /* Calculate window height */
  1111. X wh=ng.ng_TopEdge+g->Height+INTERHEIGHT-topborder;
  1112. X
  1113. X /* Close window font */
  1114. X CloseFont(f);
  1115. X
  1116. X /* All gadgets created! */
  1117. X if (g) return(TRUE);
  1118. X
  1119. X /* Something went wrong.... */
  1120. X FreeGadgets(gl);
  1121. X return(FALSE);
  1122. X}
  1123. X
  1124. X/* Open status window */
  1125. XULONG OpenStatusWindow(void)
  1126. X{
  1127. X if (!(pubsc=LockPubScreen("Workbench"))) /* Lock Workbench screen */
  1128. X  goto osw1;
  1129. X
  1130. X if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
  1131. X  goto osw2;
  1132. X
  1133. X if (!CreateWindowGadgets())              /* Create Gadgets */
  1134. X  goto osw3;
  1135. X
  1136. X /* Open window */
  1137. X if (!(w=OpenWindowTags(&nw,
  1138. X                        WA_Left,wl,
  1139. X                        WA_Top,wt,
  1140. X                        WA_InnerWidth,ww,
  1141. X                        WA_InnerHeight,wh,
  1142. X                        WA_PubScreen,pubsc,
  1143. X                        WA_AutoAdjust,TRUE,
  1144. X                        TAG_DONE)))
  1145. X  goto osw4;
  1146. X wp=w->UserPort; /* Retrieve window port */
  1147. X
  1148. X /* Circumvent an intuition.library bug. See AutoDocs for LockPubScreen() */
  1149. X UnlockPubScreen(NULL,pubsc);
  1150. X pubsc=NULL;
  1151. X
  1152. X /* Notify Workbench about window */
  1153. X if (!(aw=AddAppWindow(NULL,NULL,w,MyMP,NULL)))
  1154. X  goto osw5;
  1155. X
  1156. X /* Add gadget list to window */
  1157. X AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  1158. X RefreshGList(gl,w,NULL,(UWORD) -1);
  1159. X GT_RefreshWindow(w,NULL);
  1160. X
  1161. X /* Window open! */
  1162. X return(1L<<wp->mp_SigBit);
  1163. X
  1164. X /* Something went wrong.... */
  1165. Xosw5: CloseWindow(w);
  1166. X      w=NULL;
  1167. Xosw4: FreeGadgets(gl);
  1168. Xosw3: FreeVisualInfo(vi);
  1169. Xosw2: if (pubsc) UnlockPubScreen(NULL,pubsc);
  1170. Xosw1: return(0);
  1171. X}
  1172. X
  1173. X/* Refresh status window gadgets */
  1174. Xvoid RefreshStatusWindow(void)
  1175. X{
  1176. X PrintStatusLine();
  1177. X RefreshGList(gl,w,NULL,2); /* Refresh only the first two gadgets */
  1178. X}
  1179. X
  1180. X/* If the window is open, detach tool list from ListView gadget */
  1181. Xvoid DetachToolList(void)
  1182. X{
  1183. X if (w) GT_SetGadgetAttrs(lvgad,w,NULL,GTLV_Labels,-1,TAG_DONE);
  1184. X}
  1185. X
  1186. X/* If the window is open, attach tool list to ListView gadget */
  1187. Xvoid AttachToolList(void)
  1188. X{
  1189. X if (w) GT_SetGadgetAttrs(lvgad,w,NULL,
  1190. X                          GTLV_Labels,&ToolList,
  1191. X                          /* If an item was selected, use it as top item */
  1192. X                          GTLV_Top,lvord<0?0:lvord,
  1193. X                          GTLV_Selected,lvord,
  1194. X                          TAG_DONE);
  1195. X}
  1196. X
  1197. X/* Handle window events */
  1198. XBOOL HandleWindowEvent(void)
  1199. X{
  1200. X BOOL rc=FALSE;             /* True if window close event */
  1201. X struct IntuiMessage *msg;
  1202. X struct ToolNode *tn;
  1203. X FILE *fh;
  1204. X
  1205. X while (msg=GT_GetIMsg(wp)) /* Pre-process Intuition messages */
  1206. X  {
  1207. X   switch (msg->Class)
  1208. X    {
  1209. X     case INTUITICKS:       /* Intuition tick received */
  1210. X      break;
  1211. X     case CLOSEWINDOW:      /* User clicked the close gadget */
  1212. X      wl=w->LeftEdge;       /* Retreive window parameters for next open */
  1213. X      wt=w->TopEdge;
  1214. X      rc=TRUE;              /* Yes, close window */
  1215. X      break;
  1216. X     case REFRESHWINDOW:    /* Window must be refreshed */
  1217. X      GT_BeginRefresh(w);
  1218. X      GT_EndRefresh(w,TRUE);
  1219. X      break;
  1220. X     case GADGETUP:         /* User released a gadget */
  1221. X      switch(((struct Gadget *) msg->IAddress)->GadgetID)
  1222. X       {
  1223. X        case LVGAD_ID:      /* User selected a ListView item */
  1224. X         lvord=msg->Code;   /* Retrieve the ordinal number of the item */
  1225. X         break;
  1226. X        case RTGAD_ID:      /* User selected the remove tool gadget */
  1227. X         if (lvord>=0)      /* Is the ordinal number valid? */
  1228. X          {                 /* Yes, search tool and remove it */
  1229. X           WORD i=0;        /* Counter */
  1230. X
  1231. X           /* Scan tool list until the ordinal number is reached */
  1232. X           for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn),i++)
  1233. X            if (i>=lvord) break;
  1234. X           lvord=-1;        /* invalidate ordinal number */
  1235. X
  1236. X           /* Remove tool from list */
  1237. X           DetachToolList();
  1238. X           RemToolNode(tn);
  1239. X           AttachToolList();
  1240. X
  1241. X           /* Refresh Gadgets */
  1242. X           RefreshStatusWindow();
  1243. X          }
  1244. X         break;
  1245. X        case SCGAD_ID:      /* User selected the save config gadget */
  1246. X         if (fh=fopen(ConfigName,"w"))      /* Open config file */
  1247. X          {
  1248. X           for (tn=GetHead(&ToolList); tn; tn=GetSucc(tn))
  1249. X            {
  1250. X             fputs(tn->tn_Node.ln_Name,fh); /* Write menu entry name */
  1251. X             if (tn->tn_RealName)           /* Exists a real name? */
  1252. X              {
  1253. X               fputs(";",fh);               /* Yes, append it */
  1254. X               fputs(tn->tn_RealName,fh);
  1255. X              }
  1256. X             fputs("\n",fh);                /* Append a new line */
  1257. X            }
  1258. X           fclose(fh);                      /* Close the config file */
  1259. X          }
  1260. X         else                               /* Could not open config file! */
  1261. X          DisplayBeep(NULL);                /* --> Flash display           */
  1262. X         break;
  1263. X       }
  1264. X      break;
  1265. X    }
  1266. X   GT_ReplyIMsg(msg); /* Reply pre-processed message */
  1267. X  }
  1268. X
  1269. X return rc;
  1270. X}
  1271. X
  1272. X/* Close status window */
  1273. Xvoid CloseStatusWindow(void)
  1274. X{
  1275. X RemoveAppWindow(aw);
  1276. X CloseWindow(w);
  1277. X w=NULL;
  1278. X FreeGadgets(gl);    /* Release allocated resources */
  1279. X FreeVisualInfo(vi);
  1280. X}
  1281. END_OF_FILE
  1282. if test 8602 -ne `wc -c <'window.c'`; then
  1283.     echo shar: \"'window.c'\" unpacked with wrong size!
  1284. fi
  1285. # end of 'window.c'
  1286. fi
  1287. echo shar: End of archive 1 \(of 1\).
  1288. cp /dev/null ark1isdone
  1289. MISSING=""
  1290. for I in 1 ; do
  1291.     if test ! -f ark${I}isdone ; then
  1292.     MISSING="${MISSING} ${I}"
  1293.     fi
  1294. done
  1295. if test "${MISSING}" = "" ; then
  1296.     echo You have the archive.
  1297.     rm -f ark[1-9]isdone
  1298. else
  1299.     echo You still need to unpack the following archives:
  1300.     echo "        " ${MISSING}
  1301. fi
  1302. ##  End of shell archive.
  1303. exit 0
  1304. -- 
  1305. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  1306. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  1307. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  1308.